package main

import (
	"fmt"
	"math/rand"
	"sort"
)

type Hero struct {
	Name string
	Age  int32
}

//实现接口必须是一个具体的类型，因此只有将[]Hero先定义为一个类型
type Heros []Hero //Hero的切片

//实现接口，用于排序
//1.实现len
func (heros Heros) Len() int {
	return len(heros)
}

//2.实现Swap
func (heros Heros) Swap(i int, j int) {
	heros[i], heros[j] = heros[j], heros[i]
}

//3.实现Less
func (heros Heros) Less(i, j int) bool {
	return heros[i].Age < heros[j].Age
}

//演示接口的最佳实践
func main() {
	//int切片的排序
	intNums := []int{2, 4, 1, 5}
	fmt.Printf("排序前：%v", intNums)
	sort.Ints(intNums)
	fmt.Printf("排序后：%v", intNums)

	//结构体切片的排序
	var heros Heros
	for i := 0; i < 10; i++ {
		hero := Hero{
			Name: fmt.Sprintf("超级英雄%v", i),
			Age:  rand.Int31n(100),
		}
		heros = append(heros, hero)
	}

	fmt.Println("排序前:")
	for _, v := range heros {
		fmt.Println(v)
	}

	sort.Sort(heros)

	fmt.Println("排序后:")
	for _, v := range heros {
		fmt.Println(v)
	}

}
